//
// Created by user on 20-5-5.
//

#ifndef _SEMAPHORE_H_
#define _SEMAPHORE_H_

#include "../Task.h"
#include "Atomic.h"
#include "../Schedule.h"

typedef struct {
    List waitList;
    Task *tsk;
} WaitQueue_T;

typedef struct {
    Atomic_T counter;
    WaitQueue_T wait;
} Semaphore_T;

/**
 * 初始化等待队列
 * @param waitQueue 等待队列
 * @param tsk 进程
 */
void waitQueueInit(WaitQueue_T *waitQueue, Task *tsk);

/**
 * 初始化信号量
 * @param semaphore 信号量结构体
 * @param count 要设置的原子变量的值
 */
void semaphoreInit(Semaphore_T *semaphore, unsigned long count);

/**
 * 销毁信号量
 * @param semaphore
 */
void __up(Semaphore_T *semaphore);

/**
 * 释放信号量
 * @param semaphore 指定信号量
 */
void semaphoreUp(Semaphore_T *semaphore);

/**
 * 创建信号量
 * @param semaphore
 */
void __down(Semaphore_T *semaphore);

/**
 * 获取信号量
 * @param semaphore
 */
void semaphoreDown(Semaphore_T *semaphore);

#endif //_SEMAPHORE_H_
